#include "StdAfx.h"
#include "ItemListClass.h"

#define INITIAL_VALUE ( -1 )

//===========================================================================
ItemList::ItemList( int size )
    : listItem(      NULL )
    , topItem(       NULL )
    , nextAvailable( NULL )
    , currentItem(   NULL )
    , maxSize(       size )
    , length(        0    )
{
    if( this->maxSize > 0 )
    {
        this->listItem      = new int[ this->maxSize ];
        this->topItem       = 
        this->nextAvailable = this->listItem;

        int * item = this->listItem;
        for( int i = 0; i < this->maxSize; i++ )
            *item++ = INITIAL_VALUE;
    }
}

//===========================================================================
ItemList::~ItemList( void )
{
    this->clearList();
}

//===========================================================================
bool ItemList::setCurrentValue( int val )
{
	if( !this->currentItem )
		return false;

	*this->currentItem = val;
    return true;
}

//===========================================================================
bool ItemList::insertBeforeCurrentItem( int val )
{
	if( !this->currentItem )
        return false;
    if( this->length >= this->maxSize )
        return false;

    int * bottomItem = this->listItem + this->maxSize;
    for( int * item = bottomItem; item != this->currentItem; item-- )
        *item = *( item - 1 );
    *this->currentItem = val;

    this->length++;
    this->nextAvailable = this->length < this->maxSize
                        ? this->currentItem + 1
                        : NULL;
    
    return false;
}

//===========================================================================
bool ItemList::appendToList( int val )
{
    if( !this->nextAvailable )
        return false;

     this->currentItem = this->nextAvailable;
    *this->currentItem = val;
     
    this->length++;
    this->nextAvailable = this->length < this->maxSize
                        ? this->currentItem + 1
                        : NULL;
    
    return true;
}

//===========================================================================
bool ItemList::removeCurrentItem( void )
{
    if( !this->currentItem )
        return false;

    int * bottomItem = this->listItem + this->maxSize;
    for( int * item = this->currentItem; item < bottomItem; item++ )
        *item = *( item + 1 );

    this->length--;
    this->nextAvailable--;

    return true;
}

//===========================================================================
void ItemList::clearList( void )
{
    if( this->listItem )
    {
        delete [] this->listItem;
        
        this->listItem      =
        this->topItem       =
        this->nextAvailable =
        this->currentItem   = NULL;
        this->maxSize       =
        this->length        = 0;
    }
}

//===========================================================================
bool ItemList::search( int val )
{
    int * item = this->listItem;
    for( int i = 0; i < this->length; i++ )
        if( *item == val )
            return true;
        else
            item++;

    return false;
}

//===========================================================================
bool ItemList::moveToNextItem( void )
{
    if( !this->currentItem )
        return false;
    if( this->atBottom() )
        return false;

    this->currentItem++;
    return true;
}

//===========================================================================
bool ItemList::moveToPreviousItem( void )
{
    if( !this->currentItem )
        return false;
    if( this->atTop() )
        return false;

    this->currentItem--;
    return true;
}

//===========================================================================
bool ItemList::moveToTopItem( void )
{
    if( !this->listItem )
        return false;
    
    this->currentItem = this->listItem;
    return true;
}

//===========================================================================
bool ItemList::moveToBottomItem( void )
{
    if( !this->currentItem )
        return false;

    this->currentItem = this->listItem + this->length;
    return true;
}

//===========================================================================
int ItemList::getListLength( void )
{
    return this->length;
}

//===========================================================================
int ItemList::getMaxSize( void )
{
    return this->maxSize;
}

//===========================================================================
bool ItemList::isEmpty( void )
{
    return this->getListLength()
         ? false
         : true;
}

//===========================================================================
bool ItemList::atTop( void )
{
    return this->currentItem == this->listItem
         ? true
         : false;
}

//===========================================================================
bool ItemList::atBottom( void )
{
    return this->currentItem == this->listItem + this->length
         ? true
         : false;
}

//===========================================================================
int ItemList::getCurrentValue( void )
{
    if( !this->currentItem )
        return -1;

    return *this->currentItem;
}

